package jmine.tec.report.api.table;

import java.io.Serializable;

import jmine.tec.report.api.RendererTarget;
import jmine.tec.report.impl.table.CellValueResolver;

/**
 * Interface que deve ser implementada por colunas de um relatório.
 * 
 * @author lundberg
 * @param <V> tipo de valor da linha
 */
public interface ReportColumn<V> extends RendererTarget, Serializable {

    /**
     * Cria a célula que deve representar o valor da coluna na linha
     * 
     * @param rowValue value
     * @return ReportCell
     */
    ReportCell createCell(V rowValue);

    /**
     * Cria a célula que é o cabeçalho da coluna.
     * 
     * @return ReportCell
     */
    ReportCell getHeader();

    /**
     * Cria a célula que deve ser o rodapé da coluna.
     * 
     * @return ReportCell
     */
    ReportCell getFooter();

    /**
     * Define o cabeçalho da coluna
     * 
     * @param reportCell reportCell
     */
    void setHeader(ReportCell reportCell);

    /**
     * Define o rodapé da coluna
     * 
     * @param reportCell reportCell
     */
    void setFooter(ReportCell reportCell);

    /**
     * Retorna o "id" da coluna. Utilizado para que a renderização da célula possa ser sobrescrita/especializada de forma específica para o
     * meio utilizado.
     * 
     * @return id
     */
    String getId();

    /**
     * Obtém uma o tipo de renderer
     * 
     * @return rendererType
     */
    String getRendererType();

    /**
     * Define o tipo de renderer
     * 
     * @param rendererType rendererType
     */
    void setRendererType(String rendererType);

    /**
     * Obtém o {@link CellValueResolver} associado a essa coluna.
     * 
     * @return o {@link CellValueResolver} associado a essa coluna
     */
    CellValueResolver<V> getCellValueResolver();
}
